const maxRetryTimes = 3; //请求最大重试次数

/**
 * get请求
 */
var requestGet = options => {
  if (options['_retryTimes'] && options['_retryTimes'] >= maxRetryTimes) {
    // 如果重试次数大于 最大重试次数 放弃重试，直接提示异常，避免死循环
    wx.showToast({
      title: "未知错误，稍后重试",
      icon: "none",
      mask: true
    });
    return;
  }
  wx.showLoading({
    title: options.loadingMessage || '努力加载中',
  });
  wx.request({
    url: options.url, //url 中不能有端口
    data: options.data,
    method: "GET",
    header: getApp().globalData.requestHeader,
    success: res => {
      if (res.statusCode >= 200 && res.statusCode < 300) {
        if(!options.success){
          return;
        }
        if (options.original) {
          options.success(res);
        } else {
          options.success(res.data.data);
        }
      } else if (res.statusCode == 401) {
        //重新登录
        wxLogin(function () {
          // 设置重试次数
          if (options['_retryTimes']) {
            options['_retryTimes'] += 1;
          } else {
            options['_retryTimes'] = 2;
          }
          // 重新发起请求
          requestGet(options);
        });
      } else {
        if (res.data.result == "error") {
          if (options.fail) {
            options.fail(res.data);
          } else {
            wx.showToast({
              title: res.data.message,
              icon: "none",
              mask: true
            });
          }
        } else {
          wx.showToast({
            title: "服务器处理错误！",
            icon: "none",
            mask: true
          })
        }
      }
    },
    fail: res => {
      wx.showModal({
        title: '网络异常',
        content: '请检查网络连接',
        confirmText: "确定",
        showCancel: false,
        success: function (res) {
          console.log(res);
          if (res.confirm) {
            console.log('用户点击主操作')
          } else {
            console.log('用户点击辅助操作')
          }
        }
      });
    },
    complete: res => {
      wx.hideLoading();
    }
  })
};

/**
 * post请求
 */
var requestPost = options => {
  if (options['_retryTimes'] && options['_retryTimes'] >= maxRetryTimes) {
    // 如果重试次数大于 最大重试次数 放弃重试，直接提示异常，避免死循环
    wx.showToast({
      title: "未知错误，稍后重试",
      icon: "none",
      mask: true
    });
    return;
  }
  wx.showLoading({
    title: options.loadingMessage || '努力加载中',
  });
  wx.request({
    url: options.url, //url 中不能有端口
    data: options.data,
    header: getApp().globalData.requestHeader,
    method: "POST",
    dataType: "json", //请求为json的请求，会在返回结果时对结果进行json.parse操作
    success: res => {
      if (res.statusCode >= 200 && res.statusCode < 300) {
        options.success(res.data.data);
      } else if (res.statusCode == 401) {
        //重新登录
        wxLogin(function () {
          // 设置重试次数
          if (options['_retryTimes']) {
            options['_retryTimes'] += 1;
          } else {
            options['_retryTimes'] = 2;
          }
          // 重新发起请求
          requestPost(options);
        });
      } else {
        if (res.data.result == "error") {
          //重新登录
          wx.showToast({
            title: res.data.message,
            icon: "none",
            mask: true
          })
        } else {
          wx.showToast({
            title: "服务器处理错误！",
            icon: "none",
            mask: true
          })
        }
      }
    },
    fail: res => {
      wx.showModal({
        title: '网络异常',
        content: '请检查网络连接',
        confirmText: "确定",
        showCancel: false,
        success: function (res) {
          console.log(res);
          if (res.confirm) {
            console.log('用户点击主操作')
          } else {
            console.log('用户点击辅助操作')
          }
        }
      });
    },
    complete: res => {
      wx.hideLoading();
    }
  })
};

/**
 * 登陆接口（后台拦截401）
 */
const wxLogin = function (callback) {
  // 登录
  wx.login({
    success: res => {
      // 发送 res.code 到后台换取 openId, sessionKey, unionId
      // 把code发送到后台换取openId,sessionKey,unionId
      wx.request({
        url: getApp().globalData.apiServerUrl + "/wx/session/code",
        data: { code: res.code },
        fail: res => {
          wx.showToast({
            title: '网络异常，请检查网络！',
            icon: "none",
            mask: true
          });
        },
        success: res => {
          console.log(res);
          if (res.data && res.data.result == 'error') {
            // 登录失败
            wx.showToast({
              title: "登录失败，" + res.data.message,
              icon: "none",
              mask: true
            });
          } else {
            // 登录成功之后，记录后台SessionId到globalData
            if (res.header['Set-Cookie']) {
              getApp().globalData.requestHeader.Cookie = res.header['Set-Cookie'];
              wx.setStorageSync('Cookie', res.header['Set-Cookie']);
              getApp().globalData.userLoginReady = true;
            }

            if (callback) {
              callback();
            }
          }
        }
      });
    }
  });
}

module.exports = {
  get: requestGet,
  post: requestPost
}